perm filename DRIVE.PAL[V,VDS] blob sn#277643 filedate 1977-04-16 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.TITLE DRIVE
C00006 00003	"CLKSER" - CLOCK INTERRUPT ROUTINE
C00011 00004	"ANGLES" - SUBR. TO READ CURRENT JOINT ANGLES AND HAND OPENING
C00014 00005	"DACOUT" - SUBR. TO OUTPUT DAC VALUES GIVEN JOINT ANGLES       
C00016 00006	"RELBRK"&"SETBRK" - SUBR. TO RELEASE AND SET BRAKE BITS        
C00018 ENDMK
C⊗;
.TITLE DRIVE

;THIS ROUTINE OUTPUTS THE DAC VALUES FOR A GIVEN JOINT MOTION.  "DRIVE"
;REQUIRES AS ITS ONLY ARGUMENT A POINTER TO A TABLE OF MOTION VARIABLES.
;A DESCRIPTION OF THE MOTION VARIABLE TABLE FOLLOWS:
;
;	DRVLST→	JTMASK	;BIT MASK TO CHECK IF ALL REQUIRED JOINTS ARE
;			;  WITHIN FINAL ERROR TOLERANCE.  THIS TEST
;			;  IS USED TO TERMINATE A NORMAL MOTION.
;		TTIME	;TOTAL PERMITTED JOINT MOTION TIME IN 5
;			;  MILLISECOND COUNTS.  A TIME OUT ERROR IS
;			;  AFTER TTIME*5 MILLISECONDS
;		RUNSUB	;ADDR. OF SUBR TO BE CALLED EVERY 20 MSEC TO
;			;  UPDATE THE JOINT SET POINTS. ALL REGISTERS
;			;  ARE AVAILABLE FOR USE, R0 ← SET PT. TIME,
;			;  R1 ← PTR TO JOINT ANGLE BUFFER. IF "STPMVE"
;			;  IS SET BY THIS ROUTINE R0 MUST CONTAIN AN
;			;  ERROR MESSAGE CODE ON EXIT.
;
;ALL JOINTS OF THE ARM JOINTS ARE SERVOED EVERY 5 MSEC. UNTIL EITHER THE
;MOTION IS COMPLETED,THE PANIC BUTTON IS HIT, OR A TIME OUT ERROR OCCURS.
;THE IN RANGE BITS FOR THE JOINTS THAT ARE BEING CHECKED ARE NOT USED UNTIL
;AFTER THE "FINAL" BIT IS SET IN THE 8TH WORD OF ONE OF THE JT ANGLE ARRAYS
;THAT ARE PASSED TO THE "RUNSUB" ROUTINE.  THE "RUNSUB" ROUTINE SHOULD SET
;THE "FINAL" BIT AFTER ALL INCREMENTAL SET POINTS HAVE BEEN COMPUTED.  IN
;BETWEEN CALLS TO "RUNSUB", LINEAR INTERPOLATION IS USED TO GENERATE
;INTERMEDIATE SET POINTS. A SAMPLE CALLING SEQUENCE TO "DRIVE" FOLLOWS:
;
;		MOV	#DRVLST,R1
;		JSR	PC,DRIVE
;
;"DRIVE" INDICATES ANY ERROR CONDITIONS GENERATED DURING THE MOTION
;BY LEAVING BITS SET IN THE ARM STATUS WORD "ARMS".

;REGISTERS USED:
;	R1 PASSES ARGUMENTS AND IS ALTERED
;	R0,R2,R3 ARE GARBAGED

;DEFINITIONS:

JTMASK	==0
TTIME	==2
RUNSUB	==4

DRIVE:	MOV	R1,@#DRVLST	;SAVE PTR TO DRIVE DATA
	MOV	@#MODES,R0	;SET ANY SPECIAL MODES REQUIRED
	JSR	PC,RELBRK
	MOV	#BUF1+2,R0	;INIT JT ANGLE BUFFERS TO CURRENT LOCATION
	MOV	#BUF2+2,R1
	MOV	#DANGLE,R2
	MOV	#7,R3
1$:	MOV	(R2),(R0)+
	MOV	(R2)+,(R1)+
	SOB	R3,1$
	CLR	(R0)		;CLEAR FINAL BIT
	CLR	(R1)
	MOV	#-1,@#PTIME	;PRESENT TIME IN 5 MSEC COUNTS
	CLR	@#DNECNT	;# OF SEQUENTIAL TIMES IN RANGE
	CLR	@#DRVERR	;ERROR MESSAGE CODE
	CLR	@#BADBIT	;JOINT OUT OF RANGE BITS
	BIS	#RUN,@#ARMS	;INDICATE ARM IN MOTION
AWAIT:	WAIT			;WAIT TILL MOTION COMPLETED
	BIT	#RUN,@#ARMS
	BNE	AWAIT
	MOV	@#DRVERR,R1	;ERROR MESSAGE INDEX
	BEQ	.+6
DRVMES:	JSR	PC,TYPERR	;TYPE OUT ANY NECESSARY ERROR MESS.
	MOV	@#MODES,R0	;TURN OFF SPECIAL MODES
	JSR	PC,SETBRK
	MOV	@#PMODES,@#MODES;CLEAR ALL TEMPORARY MODES
	RTS	PC

;END OF "DRIVE"
;"CLKSER" - CLOCK INTERRUPT ROUTINE

CLKSER:	MOV	R0,-(SP)	;SAVE ALL REGISTERS
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	MOV	@#DR11S,-(SP)

	TST	@#WAITNG	;START-UP WAIT?
	BLE	1$
	DEC	@#WAITNG	;YES, TIME TO INITIALIZE RUNNING?
	BGT	SETDAC		;NO
	MOV	#ENABLE+ARMBRK,R0;YES, RELEASE ARM BRAKES
	JSR	PC,RELBRK

1$:	BIT	#RUN,@#ARMS	;ARM IN MOTION?
	BEQ	SETDAC		;NO JUST RE-FRESH DACS

	MOV	#STTMDE,@#DR11S	;FETCH SUBDEVICE BITS
	MOV	@#DR11I,R0
	MOV	@#DRVLST,R5	;GET POINTER TO DRIVE DATA

	MOV	#ABORT,R1	;HAS SOMEONE TYPED ON THE TTY?
	JSR	PC,TICKLE
	BCS	SIGERR

	BIT	#PANIC,R0	;PANIC BUTTON HIT?
	BEQ	SIGER1

	BIT	#ISON,R0	;HARDWARE SERVO STILL ENABLED?
	BEQ	SIGER2

	INC	@#PTIME		;INCREMENT TIME COUNT
	CMP	@#PTIME,TTIME(R5);OUT OF TIME?
	BLO	2$		;NO
	MOV	@#BADBIT,R1	;GET OUT OF RANGE BITS
	SWAB	R1
	BIS	#NOTIME,R1
	BR	SIGERR

2$:	BIT	#CHKDNE,@#ARMS	;WAITING FOR JOINTS TO FINISH?
	BEQ	NEWSET		;BRANCH IF STILL MOVING SET POINTS
	INC	@#DNECNT	;ASSUME JOINTS WITHIN FINAL RANGE
	MOV	JTMASK(R5),R2	;IN RANGE?
	BIC	R0,R2
	BEQ	3$		;YES
	CLR	@#DNECNT	;ELSE ZERO IN RANGE COUNT
	MOV	R2,@#BADBIT	;SAVE ERROR BITS
3$:	CMP	#6,@#DNECNT	;DON'T STOP TILL IN RANGE 6 TIMES
	BGT	SETDAC		;  IN A ROW
	BR	RUNDNE		;ALL DONE, STOP MOTION

NEWSET:	MOV	#DANGLE,R0	;UPDATE SET POINT
	MOV	#7,R2		;7 JOINTS IN ALL
	BIT	#3,@#PTIME	;TIME TO COMPUTE NEW JOINT ANGLES?
	BEQ	CALRUN		;YES
	MOV	#ONE4TH,R3	;NO, NEW ANG← OLD ANG + 1/4 CHANGE IN ANG
1$:	SUB	(R3)+,(R0)+
	SOB	R2,1$
	BR	SETDAC

CALRUN:	BIT	#WORKNG,@#ARMS	;RUNSUB CLOCK OVERRUN?
	BNE	SIGER3

	MOV	@CBUF,R1	;NEW ANGLE ← FUTURE ANGLE
	MOV	R1,@#CBUF
	MOV	(R1),R3		;NEW FUTURE ANGLE
	CMP	(R1)+,(R3)+
1$:	MOV	(R1)+,R4	;NEW SET POINT
	MOV	R4,(R0)+
	SUB	(R3)+,R4	;-CHANGE IN ANGLE/4
	ASH	#-2,R4
	MOV	R4,ONE4TH-DANGLE-2(R0)
	SOB	R2,1$

	BIT	#FINAL,(R1)	;FINAL SET POINT?
	BNE	ISFINL		;YES
	BIS	#STRWRK,@#ARMS	;ELSE EXECUTE RUNSUB
	BR	SETDAC

ISFINL:	MOV	#NOINTG,R0	;RE-ENABLE HARDWARE INTEGRATION
	JSR	PC,SETBRK
	BIS	#CHKDNE,@#ARMS	;INDICATE JUST NULLING ERRORS
	TST	JTMASK(R5)	;DO NULLING?
	BEQ	RUNDNE		;NO

SETDAC:	CLR	R0		;OUTPUT DAC VALUES
	MOV	#7,R1
	JSR	PC,DACOUT

	BIT	#STRWRK,@#ARMS	;START UP RUNSUB?
	BEQ	CLKDNE
	ADD	#STRWRK,@#ARMS	;INDICATE WORKING
	MOV	@#PTIME,R0	;TIME TO EVALUATE SET POINT
	ADD	#4,R0
	MOV	@#CBUF,R1	;POINT TO JOINT ANGLE BUFFER TO FILL
	TST	(R1)+
	MTPS	UNLOCK		;ALLOW CLOCK INTERRUPTS
	JSR	PC,@RUNSUB(R5)
	BIC	#WORKNG,@#ARMS
	BIT	#STPMVE,@#ARMS	;STOP ARM IMMEDIATELY?
	BEQ	CLKDNE		;NO
	BR	STPJT		;YES

SIGER3:	ADD	#RUNERR-NOHDWR,R1
SIGER2:	ADD	#NOHDWR-PANBUT,R1
SIGER1:	ADD	#PANBUT-ABORT,R1
SIGERR:	BIS	#CANPRO,@#ARMS	;SET ERROR BITS
	MOV	#-1,R0		;SET THE BRAKES
	JSR	PC,SETBRK
STPJT:	MOV	R1,@#DRVERR
RUNDNE:	BIC	#177400,@#ARMS

CLKDNE:	MOV	(SP)+,@#DR11S
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTI


;END OF "CLKSER" ROUTINE
;"ANGLES" - SUBR. TO READ CURRENT JOINT ANGLES AND HAND OPENING

;JOINT ANGLES ARE READ FROM THE ADC AND CONVERTED INTO DEGREES AND
;INCHES.  THE FIRST JOINT TO BE READ MUST BE SPECIFIED BY REGISTER
;R0 ( I.E. 0-12 FOR THE ARM JOINTS AND 14 FOR THE HAND ) AND THE NUMBER
;OF JOINTS TO BE READ MUST BE SPECIFIED IN R1. A SAMPLE CALLING
;SEQUENCE FOLLOWS:
;
;		MOV	#FRSTJT,R0	;(FIRST JOINT - 1)*2
;		MOV	#JTS,R1		;NUMBER OF JOINTS TO BE READ
;		MOV	#JANGLES,R2	;SAVE READING IN HERE
;		JSR	PC,ANGLES	;NO ARGUMENTS REQUIRED
;
;IF THE ADC READ TAKES TOO LONG TO EXECUTE, THE C BIT IS SET, "ADERR"
;IS INDICATED IN THE ARM STATUS WORD, AND R1 CONTAINS AN ERROR CODE
;WHEN THIS ROUTINE EXITS.  OTHERWISE, THE C BIT IS CLEARED.

;REGISTERS USED:
;	R0,R1,R2  PASS ARGUMENTS AND ARE GARBAGED

ANGLES:	MOV	R4,-(SP)
	MOV	R5,-(SP)
	BIC	#3+ADCENB,@#DR11S	;SET DR11 TO ADC MODE
	BIS	#ADCMDE,@#DR11S	
	ADD	#ACHAN,R0		;SEND OFF FIRST POT CHANNEL
	MOV	(R0)+,@#DR11O
1$:	JSR	PC,ADCRDR		;R4←ADC READING
	BCS	ANGDNE			;ERROR?
	MOV	(R0)+,@#DR11O		;START CONVERTING NEXT POT
	MUL	SCALE-ACHAN-4(R0),R4	;CONVERT TO DEG. OR INCHES
	ASHC	#5,R4
	ADD	OFFSET-ACHAN-4(R0),R4
	MOV	R4,(R2)+
	SOB	R1,1$		;MORE POTS?
	CLC
ANGDNE:	MOV	(SP)+,R5
	MOV	(SP)+,R4
	RTS	PC


GETADC:	BIC	#3+ADCENB,@#DR11S	;ADC MODE
	BIS	#ADCMDE,@#DR11S
	MOV	R0,@#DR11O	;READ CHANNEL
	JSR	PC,ADCRDR
	RTS	PC


ADCRDR:	MOV	#100.,R4	;ADC TIME OUT COUNT
1$:	TSTB	@#DR11S		;ADC FINISHED?
	BMI	2$
	SOB	R4,1$		;LOOP TILL TIME RUNS OUT
	BIS	#CATERR,@#ARMS	;INDICATE ADC ERROR, CAN'T PROCEED
	MOV	#ADCERR,R1	;SIGNAL ERROR AND EXIT
	SEC
2$:	MOV	@#DR11I,R4	;ADC READING
	RTS	PC


;END OF "ANGLES"
;"DACOUT" - SUBR. TO OUTPUT DAC VALUES GIVEN JOINT ANGLES       

;THIS ROUTINE REQUIRES TWO ARGUMENTS, THE LOGICAL NUMBER OF THE FIRST
;JOINT TO HAVE IT'S DAC OUTPUT SET AND THE NUMBER OF JOINTS TO BE
;SERVICED.  ALL JOINTS FROM THE 1ST. JOINT TO (1ST JOINT -1 + NUMBER
;OF JOINTS) HAVE THEIR DAC VALUES SET.  THE DAC VALUES ARE TAKEN FROM
;THE ARRAY "DANGLE" AND ARE CONVERTED TO DAC UNITS VIA THE CONSTANTS
;BOFFST AND BSCALE.
;
;		MOV	#FRSTJT,R0	;(FIRST JOINT - 1)*2 
;		MOV	#JTS,R1		;# OF JOINTS TO BE SERVICED
;		JSR	PC,DACOUT	;NO ARGUMENTS REQUIRED
;
;THIS ROUTINE NEVER RETURNS AN ERROR CODE.

;REGISTERS USED:
;	R0 AND R1 PASS ARGUMENTS AND ARE GARBAGED
;	R2,R3 ARE GARBAGED

DACOUT:	BIC	#3,@#DR11S	;DR11 DAC MODE
DACO1:	MOV	DANGLE(R0),R2  	;DESIRED JOINT ANGLE
	SUB	BOFFST(R0),R2	;SUBT. POT OFFSET
	MUL	BSCALE(R0),R2	;CONVERT TO DAC UNITS
	ASHC	BSHIFT(R0),R2
	BIC	#170000,R2	;CLEAR ROOM FOR CHANNEL, POS. MODE
	BIS	DCHAN(R0),R2	;ADD DAC CHANNEL
	MOV	R2,@#DR11O   	;OUTPUT DAC READING AND CHANNEL
	TST	(R0)+
	SOB	R1,DACO1
	RTS	PC

;END OF "DACOUT"
;"RELBRK"&"SETBRK" - SUBR. TO RELEASE AND SET BRAKE BITS        

;THESE ROUTINES ARE USED TO SELECTIVELY TURN THE BITS IN THE BRAKE
;REGISTER ON AND OFF.  "RELBRK" SETS BITS AND "SETBRK" TURNS THEM
;OFF.  THE SOFTWARE REGISTER "BRAKES" IS USED TO KEEP TRACK OF
;THE STATE OF THE BITS IN BETWEEN CALLS TO THESE ROUTINES.  SAMPLE
;CALLING SEQUENCES TO THESE ROUTINES FOLLOWS:
;
;		MOV	#BRAKES,R0	;SEND BRAKE BITS
;		JSR	PC,RELBRK
;			or
;		JSR	PC,SETBRK

;REGISTERS USED:
;	R0 PASSES ARGUMENTS AND IS NOT MODIFIED

RELBRK:	MOV	#BRKMDE,@#DR11S	;SET BRAKE BIT MODE
	BIS	R0,@#BRAKES	;TURN ON OLD BITS + NEW BITS
	MOV	@#BRAKES,DR11O
	RTS	PC


SETBRK:	MOV	#BRKMDE,@#DR11S	;SET BRAKE BIT MODE
	BIC	R0,@#BRAKES	;TURN OFF THESE BITS
	MOV	@#BRAKES,@#DR11O
	RTS	PC
	

;END OF BRAKE ROUTINES